package com.cy.pj.module.controller;


/*
* 通过此controller处理请求中的参数
* 1)将请求参数直接赋值给方法参数中的直接量变量（8种封装类和Spring+Date）
* 2)将请求参数直接赋值给pojo对象（pojo对象 需要提供与请求参数相对应的set方法）
* 3)将请求参数直接赋值给map对象（key/value）
*
* 客户端常用传参方式？
* 1）普通方式：url?paramName=paramValue&paramName2=paramValue2
* 2)rest方式：path/{paramName}
* */

import com.cy.pj.module.pojo.RequestParameter;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;
import java.util.Map;

@RestController
public class ParamObjectController {      //handler
    //以直接量的方式接收请求中的参数
    //@RequestParam此注解可以描述方法参数，默认客户端必须要给它描述的参数传值，不传值则会出现400异常
    /*
    * @DataTimeFormat：描述日期参数，用于指定可以接收的日期格式，默认为yyyy/mm/dd
    * */
    @RequestMapping("/doHandleRequestParam01")
    public String doHandleRequestParam01(String name){

        return "request param is "+name;
    }

    @RequestMapping("/doHandleRequestParam02")
    public String doHandleRequestParam02(String name, Date startDate){

        return "request param is "+name+"/startDate="+startDate;
    }

    /*
    * rest风格的url定义
    * rest风格：一种软件架构编码风格，这种风格定义了url的一种格式，其语法为：
    * /a/b/{c}/d/{e},其中{}内部内容为变量
    *
    * */
    @RequestMapping("/doHandleRequestParam03/{id}")
    public String doHandleRequestParam03(@PathVariable Integer id){

        return " request param id is "+id;
    }

    /**
     * 通过方法中的pojo对象来接收请求中参数数据，但这里有一个前提条件：
     * pojo对象的set方法需要与请求参数的参数名匹配
     *
     * http://localhost/doHandleRequestParam04?name=tony   name需要和pojo对象set方法的参数名相匹配
     * @param pojo
     * @return
     */
    @RequestMapping("/doHandleRequestParam04")
    public String   doHandleRequestParam04(RequestParameter pojo){
        return " Request params "+pojo.toString();
    }

    /**
     *
     * http://localhost/doHandleRequestParam05/Jason/2020-12-05
     * @param pojo
     * @return
     */
    @RequestMapping("/doHandleRequestParam05/{name}/{startDate}")
    public String   doHandleRequestParam05(RequestParameter pojo){
        return " Request params "+pojo.toString();
    }


    /**
     * 假如客户端请求参数过多，但又不想定义pojo接收请求参数，那该如何实现呢
     * 借助map可以但是一般不推荐，map无法对请求参数进行限制
     * 假如使用map接收请求参数，需要在方法参数前使用@RequestParam注解进行描述
     * @param map
     * @return
     */
    @RequestMapping("/doHandleRequestParam06")
    public String   doHandleRequestParam06(@RequestParam Map<String,Object> map){
        return " Request params "+map.toString();
    }

    /**
     * 说明：当使用map接收rest风格中的数据时，需要使用@PathVariable注解对map参数进行描述
     * 不能使用@RequestParam注解，因为此注解描述的参数只能接收普通URL中？后面定义的参数值
     * @param map
     * @return
     */
    @RequestMapping("/doHandleRequestParam07/{name}/{startDate}")
    public String   doHandleRequestParam07(@PathVariable Map<String,Object> map){
        return " Request params "+map.toString();
    }
}
